//package com.mcb.autopublish.demos.web.generate;
//
//import com.baomidou.mybatisplus.annotation.DbType;
//import com.baomidou.mybatisplus.core.toolkit.StringUtils;
//import com.baomidou.mybatisplus.generator.AutoGenerator;
//import com.baomidou.mybatisplus.generator.config.*;
//import com.baomidou.mybatisplus.generator.config.rules.DateType;
//import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
//
//import java.io.BufferedWriter;
//import java.io.File;
//import java.io.IOException;
//import java.nio.charset.StandardCharsets;
//import java.nio.file.Files;
//import java.nio.file.Path;
//import java.nio.file.Paths;
//
//public class GeneratecodeApplication {
//
//    public static void main(String[] args) throws IOException {
//        //代码输出路径
//        String codeOutputDir = "E:\\MyProject\\代码生成器生成代码";
//        Path codeOutputDirPath = Paths.get(codeOutputDir);
//        if (Files.exists(codeOutputDirPath)) {
////			FileUtils.deleteDirectory(new File(codeOutputDir));
//        }
//        //作者
//        String author = "machengbang";
//        //服务名
//        String serviceName = "web";
//        //模块名(直播、视频服务相关表生成代码时可不填写)
//        String moduleName = "book";
//
//        String dbUrl = "jdbc:mysql://localhost:3306/fengbook?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&allowPublicKeyRetrieval=true";
//        String dbUserName = "root";
//        String dbPassword = "1qaz@0okm4dB";
//        //生成数据表
//        String[] includeTables = new String[]{
//                "books"
//        };
//        //排除的数据表
//        String[] excludeTables = new String[]{};
//
//        AutoGenerator mpg = new AutoGenerator();
//        {
//            // 全局配置
//            GlobalConfig gc = new GlobalConfig();
//            gc.setOutputDir(codeOutputDir);
//            //实体类后缀
//            //gc.setEntityName("%sModel");
//            gc.setFileOverride(true);
//            // 开启 BaseResultMap
//            gc.setBaseResultMap(true);
//            // XML columnList
//            gc.setBaseColumnList(true);
//            // 指定生成的主键的ID类型
//            //gc.setIdType(IdType.ID_WORKER);
//            // XML 二级缓存
//            gc.setEnableCache(false);
//            //不继承默认父类
//            gc.setActiveRecord(false);
//            //Service命名方式 ,生成接口前面就不会有I
//            gc.setServiceName("%sService");
//            //ServiceImpl命名方式
//            gc.setServiceImplName("%sServiceImpl");
//            gc.setAuthor(author);
//            // 是否打开输出目录
//            gc.setOpen(true);
//            // 时间类型对应策略: 只使用 java.util.date 代替
//            gc.setDateType(DateType.ONLY_DATE);
//            mpg.setGlobalConfig(gc);
//        }
//        {
//            // 数据源配置
//            DataSourceConfig dsc = new DataSourceConfig();
//            dsc.setDbType(DbType.MYSQL);
//            dsc.setDriverName("com.mysql.cj.jdbc.Driver");
//            dsc.setUsername(dbUserName);
//            dsc.setPassword(dbPassword);
//            dsc.setUrl(dbUrl);
//            mpg.setDataSource(dsc);
//        }
//        String entityPackage = "";
//        {
//            // 包配置
//            PackageConfig pc = new PackageConfig();
//            pc.setParent(String.format("com.mcb.autopublish.demos.%s", serviceName));
//            // 模块名称, 这里可以根据不同模块来写
////			pc.setModuleName("user");
//
//            entityPackage = String.format("po.%s", moduleName);
//            String servicePackage = String.format("service.%s", moduleName);
//            String serviceImplPackage = String.format("service.%s.impl", moduleName);
//            String mapperPackage = String.format("mapper.%s", moduleName);
//            String mapperXmlPackage = String.format("mapper.%s", moduleName);
//            String controllerPackage = String.format("controller", moduleName);
//
//            // Entity包名
//            pc.setEntity(entityPackage);
//            pc.setService(servicePackage);
//            pc.setServiceImpl(serviceImplPackage);
//            pc.setMapper(mapperPackage);
//            pc.setXml(mapperXmlPackage);
//            pc.setController(controllerPackage);
//            mpg.setPackageInfo(pc);
//        }
//        {
//            // 策略配置
//            StrategyConfig strategy = new StrategyConfig();
//            // 全局大写命名 ORACLE 注意
////            strategy.setCapitalMode(true);
//            //此处可以修改为您的表前缀
////			strategy.setTablePrefix("t_");
//            // 数据库表映射到实体的命名策略: 下划线转驼峰命名
//            strategy.setNaming(NamingStrategy.underline_to_camel);
//            // 数据库表字段映射到实体的命名策略: 下划线转驼峰命名
//            strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//            // Entity父类
//            strategy.setSuperEntityClass("com.mcb.autopublish.demos.common.entity.po.BasePo");
//            // Entity是否生成字段常量
//            strategy.setEntityColumnConstant(false);
//            // Entity使用lombok去除默认的getset方法
//            strategy.setEntityLombokModel(true);
//            // 驼峰转连字符
//            strategy.setControllerMappingHyphenStyle(false);
//            // Entity公共字段
////            strategy.setSuperEntityColumns(new String[]{"id"});
//            // Controller采用rest风格
//            strategy.setRestControllerStyle(true);
//            // Controller父类
//            strategy.setSuperControllerClass("com.mcb.autopublish.demos.controller.BaseController");
//            // Service父类
//            strategy.setSuperServiceClass(null);
//            // ServiceImpl父类
//            strategy.setSuperServiceImplClass(null);
//            // Mapper父类
////            strategy.setSuperMapperClass(null);
//            // 需要生成的表
//            strategy.setInclude(includeTables);
//            // 排除生成的表
//            strategy.setExclude(excludeTables);
//            strategy.entityTableFieldAnnotationEnable(false);
//            // 逻辑删除属性名称,@TableLogic注解参数 value = "" 未删除的值，默认值为0 delval = "" 删除后的值，默认值为1,@TableLogic(value="原值",delval="改值")
//            strategy.setLogicDeleteFieldName("deleted");
//            // strategy.setTableFillList(tableFillList);
//            mpg.setStrategy(strategy);
//        }
//
//        {
//            // 自定义模板配置
//            TemplateConfig tc = new TemplateConfig();
//            tc.setEntity("templates/entity.java.vm");
//            tc.setMapper("templates/mapper.java.vm");
//            tc.setXml("templates/mapper.xml.vm");
//            tc.setService("templates/service.java.vm");
//            tc.setServiceImpl("templates/serviceImpl.java.vm");
//            tc.setController("templates/controller.java.vm");
//            mpg.setTemplate(tc);
//        }
//
//        // 执行生成
//        mpg.execute();
//
////		List<TableInfo> tableInfos = mpg.getConfig().getTableInfoList();
////   	    System.out.println(tableInfos);
//
//        for (String table : includeTables) {
//            //生成dto
//            String dtoName = underline2Camel(table, true);
//            String basePath = codeOutputDir + File.separator + "com" + File.separator + "hyg" + File.separator + serviceName;
//            String modulePath = StringUtils.isNotEmpty(moduleName) ? moduleName + File.separator : "";
//            String poFile = basePath + File.separator + "po" + File.separator + modulePath + dtoName + ".java";
//            String dtoFileDirectory = basePath + File.separator + "dto" + File.separator;
//
//            generateDto(poFile, dtoFileDirectory, dtoName, 0, modulePath);
//            generateDto(poFile, dtoFileDirectory, dtoName, 1, modulePath);
//            generateDto(poFile, dtoFileDirectory, dtoName, 2, modulePath);
//
//        }
//    }
//
//    public static void generateDto(String poFile, String dtoFileDirectory, String poName, int flag, String modulePath) throws IOException {
//        String dtoName = "";
//        if (flag == 0) {
//            dtoName = "QueryRequest";
//            dtoFileDirectory += "request" + File.separator;
//        } else if (flag == 1) {
//            dtoName = "Request";
//            dtoFileDirectory += "request" + File.separator;
//        } else if (flag == 2) {
//            dtoName = "Response";
//            dtoFileDirectory += "response" + File.separator;
//        }
//        dtoName = poName + dtoName + ".java";
//        dtoFileDirectory += modulePath;
//
//
//        Path dtoDirectory = Paths.get(dtoFileDirectory);
//        Path dtoFilePath = Paths.get(dtoFileDirectory + File.separator + dtoName);
//        if (Files.exists(dtoFilePath)) {
//            Files.delete(dtoFilePath);
//        }
//        Files.createDirectories(dtoDirectory);
//        try {
//            Files.createFile(dtoFilePath);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        BufferedWriter writer = Files.newBufferedWriter(dtoFilePath);
//        Files.lines(Paths.get(poFile), StandardCharsets.UTF_8).forEach(ele -> {
//            try {
//                if (ele.contains("IdType") || ele.contains("po.BasePo")
//                        || ele.contains("TableId") || ele.contains("TableLogic") || ele.contains("TableField")
//                        || ele.contains("EqualsAndHashCode")) {
//                    return;
//                }
//                if (ele.contains("po.")) {
//                    if (flag != 2) {
//                        ele = ele.replaceAll("po.", "dto.request.");
//                    } else {
//                        ele = ele.replaceAll("po.", "dto.response.");
//                    }
//                } else if (ele.contains(poName)) {
//                    if (flag == 0) {
//                        ele = ele.replaceAll(poName + " extends BasePo", poName + "QueryRequest extends BaseRequest ");
//                    } else if (flag == 1) {
//                        ele = ele.replaceAll(poName + " extends BasePo", poName + "Request");
//                    } else {
//                        ele = ele.replaceAll(poName + " extends BasePo", poName + "Response");
//                    }
//                } else if (ele.contains("lombok.experimental.Accessors")) {
//                    if (flag != 0) {
//                        return;
//                    }
//                    ele = ele.replaceAll("lombok.experimental.Accessors", "lombok.ToString");
//                } else if (ele.contains("@Accessors(chain = true)")) {
//                    if (flag != 0) {
//                        return;
//                    }
//                    ele = ele.replaceAll("Accessors", "ToString").replaceAll("chain", "callSuper");
//
//                }
//
//                writer.write(ele);
//                writer.newLine();
//
//                if (flag == 0 && ele.contains("lombok.ToString")) {
//                    writer.write("import com.mcb.autopublish.demos.common.entity.request.BaseRequest;");
//                    writer.newLine();
//                }
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        });
//        writer.flush();
//        writer.close();
//    }
//
//    private static String underline2Camel(String line, boolean... firstIsUpperCase) {
//        String str = "";
//
//        if (StringUtils.isEmpty(line)) {
//            return str;
//        } else {
//            StringBuilder sb = new StringBuilder();
//            String[] strArr;
//            // 不包含下划线，且第二个参数是空的
//            if (!line.contains("_") && firstIsUpperCase.length == 0) {
//                sb.append(line.substring(0, 1).toLowerCase()).append(line.substring(1));
//                str = sb.toString();
//            } else if (!line.contains("_") && firstIsUpperCase.length != 0) {
//                if (!firstIsUpperCase[0]) {
//                    sb.append(line.substring(0, 1).toLowerCase()).append(line.substring(1));
//                    str = sb.toString();
//                } else {
//                    sb.append(line.substring(0, 1).toUpperCase()).append(line.substring(1));
//                    str = sb.toString();
//                }
//            } else if (line.contains("_") && firstIsUpperCase.length == 0) {
//                strArr = line.split("_");
//                for (String s : strArr) {
//                    sb.append(s.substring(0, 1).toUpperCase()).append(s.substring(1));
//                }
//                str = sb.toString();
//                str = str.substring(0, 1).toLowerCase() + str.substring(1);
//            } else if (line.contains("_") && firstIsUpperCase.length != 0) {
//                strArr = line.split("_");
//                for (String s : strArr) {
//                    sb.append(s.substring(0, 1).toUpperCase()).append(s.substring(1));
//                }
//                if (!firstIsUpperCase[0]) {
//                    str = sb.toString();
//                    str = str.substring(0, 1).toLowerCase() + str.substring(1);
//                } else {
//                    str = sb.toString();
//                }
//            }
//        }
//        return str;
//    }
//}
